/***
 * @Description: 本文件是包含socket结构内部实现包括socket表结构的头文件
 * @Author: Liverpool
 * @Date: 2024-09-17 23:33:58
 * @LastEditTime: 2024-09-17 23:34:22
 * @LastEditors: Liverpool
 */

#ifndef SOCK_H
#define SOCK_H

#include "netComman.h"
#include "system.h"
#include "list.h"
#include "MessageHander.h"
#include "socket.h"

struct _sock_t;
struct x_sockaddr;

// 定义等待的结构体的使用环境
#define SOCK_WAIT_READ (1 << 0)
#define SOCK_WAIT_WRITE (1 << 1)
#define SOCK_WAIT_CONNECT (1 << 2)
#define SOCK_WAIT_ALL (SOCK_WAIT_READ | SOCK_WAIT_WRITE | SOCK_WAIT_CONNECT)
// 定义sock接口之间的数据等待结构体
typedef struct _sock_wait_t
{
    sys_sem_t sem;
    net_err_t err;
    int waiting;
} D_Sock_Wait;

// 不同的sock type类型定义的不同操作的回调函数
typedef struct _sock_ops_t
{
    net_err_t (*close)(struct _sock_t *sock); // 关闭
    net_err_t (*sendto)(struct _sock_t *sock, const void *buf, size_t len, int flags,
                        const struct x_sockaddr *dest, x_socklen_t dest_len, ssize_t *result_len); // 发送
    net_err_t (*recvfrom)(struct _sock_t *sock, void *buf, size_t len, int flags,
                          const struct x_sockaddr *dest, x_socklen_t *dest_len, ssize_t *result_len);  // 接收
    net_err_t (*setopt)(struct _sock_t *sock, int level, int optname, const void *optval, int optlen); // 设置socket接口参数
    void (*destory)(struct _sock_t *sock);                                                             // 销毁sokcet接口
} D_Sock_Operation;

// 定义sock表结构内部的数据结构(三种类型的套接字的基础类型结构体)
typedef struct _sock_t
{
    uint16_t local_port;  // 本地的端口号
    D_IP_ADDR local_ip;   // 本地的IP地址
    uint16_t remote_port; // 对端端口号
    D_IP_ADDR remote_ip;  // 对端IP地址

    const D_Sock_Operation *operation; // 不同类型的操作函数
    int family;                        // 协议族
    int protocol;                      // 协议
    int error;                         // 出现的结错误
    int receive_tms;                   // 接收时间
    int send_tms;                      // 发送时间
    // sock中的等待结构的相关定义
    D_Sock_Wait *recv_wait;
    D_Sock_Wait *send_wait;
    D_Sock_Wait *conn_wait;

    D_ListNode node; // sock表结构中的链表节点
} D_Sock;

// socket 内部数据结构体定义
typedef struct _x_scoket_t
{
    enum
    {
        SOCKET_STATE_FREE = 0,
        SOCKET_STATE_USED = 1,
    } state; // socket的使用状态

    D_Sock *sock; // 里面的基础结构
} x_socket_t;

// 创造socket接口数据打包定义
typedef struct _sock_create_t
{
    int family;
    int type;
    int protocol;
} D_Sock_Create;

// 数据socker接口数据结构定义
typedef struct _sock_data_t
{
    uint8_t *buf;            // 数据包地址
    size_t len;              // 数据长度
    int flags;               // 标志位
    struct x_sockaddr *addr; // 目标地址
    x_socklen_t *addr_len;
    size_t comp_len; // 实际发送的大小
} D_Sock_Data;

// 数据socker接口选项结构定义
typedef struct _sock_opt_t
{
    int level;
    int optname;
    const char *optval;
    int len;
} D_Sock_Opt;

// 向socket发送请求的外部数据结构定义接口
typedef struct _sock_req_t
{
    D_Sock_Wait *wait; // 等待结构字段
    int wait_ms;       // 等待时间
    int sockfd;
    union
    {
        D_Sock_Create create;
        D_Sock_Data data;
        D_Sock_Opt opt;
    };
} D_Sock_Request;

net_err_t socket_init(void);                                                                         // socket表结构的初始化
net_err_t sock_wait_init(D_Sock_Wait *sock_wait);                                                    // 等待结构体的初始化
void sock_wait_destroy(D_Sock_Wait *sock_wait);                                                      // 等待结构的销毁
void sock_wait_add(D_Sock_Wait *sock_wait, int ms, D_Sock_Request *req);                             // 等待结构的添加
net_err_t sock_wait_entry(D_Sock_Wait *sock_wait, int ms);                                           // 等待结构的进入函数入口
void sock_wait_leave(D_Sock_Wait *sock_wait, net_err_t err);                                         // 等待结构的离开
void sock_wakeup(D_Sock *sock, int type, int err);                                                   // 唤醒sock中的等待结构
net_err_t sock_create_request_in(struct _message_func *msg);                                         // 创造socket接口的request请求
net_err_t sock_sendto_request_in(struct _message_func *msg);                                         // 数据socket接口的发送request请求
net_err_t sock_recvfrom_request_in(struct _message_func *msg);                                       // 数据socket接口的接收request请求
net_err_t sock_setopt(struct _sock_t *sock, int level, int optname, const void *optval, int optlen); // 通用sock套接字的选项设置
net_err_t sock_setsockopt_request_in(struct _message_func *msg);                                     // sokcet套接字选项的设置

net_err_t sock_init(D_Sock *sock, int family, int protocol, const D_Sock_Operation *ops); // sock表结构内部初始化
void sock_uninit(D_Sock *sock);                                                           // sock表结构内部的释放

#endif // !SOCK_H